/**
 * ajax相关方法的封装
 */
import base from '@/common/sju.base.js';
import login from '@/common/sju.login.js';
import alert from '@/common/sju.alert.js';

// 基准地址域名
const BASE_DOMAIN = 'https://yingdedao.cn/api';
// const BASE_DOMAIN = 'http://127.0.0.2';
const UPLOAD_DOMAIN = 'https://yingdedao.cn/api';
const OTHER_URL = 'https://yingdedao.cn/api';
const WS_DOMAIN = 'https://yingdedao.cn/api';

// 环境配置
const config = {
  app: BASE_DOMAIN,
  api: BASE_DOMAIN,
  web: BASE_DOMAIN,
  otherUrl: OTHER_URL,
  wsUrl: WS_DOMAIN,
  upLoadUrl: UPLOAD_DOMAIN,
  imgServer: UPLOAD_DOMAIN
};

// 生产环境配置
if (process.env.NODE_ENV === 'production') {
  Object.assign(config, {
    app: BASE_DOMAIN,
    api: BASE_DOMAIN,
    web: BASE_DOMAIN
  });
}

const ajax = {
  ...config,

  /**
   * 构建查询字符串
   * @param {Object} params 参数对象
   * @return {string} 查询字符串
   */
  _buildQueryString(params) {
    return Object.keys(params)
      .filter(key => params[key] !== undefined && params[key] !== null && params[key] !== '')
      .map(key => {
        const value = params[key];
        // 处理数组参数
        if (Array.isArray(value)) {
          return value.map(v => `${encodeURIComponent(key)}=${encodeURIComponent(v)}`).join('&');
        }
        return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
      })
      .join('&');
  },

  /**
   * 统一请求方法
   * @param {string} method HTTP方法
   * @param {string} url 请求URL
   * @param {Object} data 请求数据
   * @param {Function} [success] 成功回调
   * @param {boolean} [showLoading] 是否显示加载
   * @param {string} [contentType] 内容类型
   * @return {Promise} Promise对象
   */
  _request(method, url, data = {}, success, showLoading = false, contentType = 'application/json') {
    // 参数调整
    if (typeof success === 'boolean') {
      showLoading = success;
      success = undefined;
    }

    // 处理GET请求参数
    if (method === 'GET') {
      const queryString = this._buildQueryString(data);
      if (queryString) {
        url += (url.includes('?') ? '&' : '?') + queryString;
      }
      data = undefined; // GET请求不需要body数据
    }

    if (showLoading) {
      alert.showLoading();
    }

    return new Promise((resolve, reject) => {
      uni.request({
        url: this.api + url,
        method,
        data,
        header: {
          'content-type': contentType,
          'Authorization': `Bearer ${login.getValue('token')}`
        },
        timeout: 60000,
        success: (res) => {
          if (res.statusCode === 200 && res?.data?.code === 200) {
            if (typeof success === 'function') {
              success(res.data);
            }
            resolve(res.data);
          } else if (res.statusCode === 401 || res?.data?.code === 401) {
            uni.showToast({ title: '登录过期，请重新登录' })
            uni.navigateTo({ url: '/pages/user/login' });
            reject(new Error('未授权，请重新登录'));
          } else {
            uni.hideLoading();
            const errorMsg = res.data?.msg || res.data?.error || '请求失败';
            alert.showError(errorMsg);
            reject(new Error(errorMsg));
          }
        },
        fail: (err) => {
          uni.hideLoading();
          console.error('请求失败:', err);
          alert.showError('网络请求失败');
          reject(err);
        },
        complete: () => {
          if (showLoading) {
            uni.hideLoading();
          }
        }
      });
    });
  },

  /**
   * GET请求
   * @param {string} url 请求URL
   * @param {Object} [params] 查询参数
   * @param {Function} [success] 成功回调
   * @param {boolean} [showLoading] 是否显示加载
   * @return {Promise} Promise对象
   */
  get(url, params = {}, success, showLoading) {
    return this._request('GET', url, params, success, showLoading);
  },

  /**
   * POST请求
   * @param {string} url 请求URL
   * @param {Object} data 请求数据
   * @param {Function} [success] 成功回调
   * @param {boolean} [showLoading] 是否显示加载
   * @param {string} [contentType] 内容类型
   * @return {Promise} Promise对象
   */
  post(url, data = {}, success, showLoading, contentType) {
    return this._request('POST', url, data, success, showLoading, contentType);
  },

  /**
   * PUT请求
   * @param {string} url 请求URL
   * @param {Object} data 请求数据
   * @param {Function} [success] 成功回调
   * @param {boolean} [showLoading] 是否显示加载
   * @return {Promise} Promise对象
   */
  put(url, data = {}, success, showLoading) {
    return this._request('PUT', url, data, success, showLoading);
  },

  /**
   * DELETE请求
   * @param {string} url 请求URL
   * @param {Object} data 请求数据
   * @param {Function} [success] 成功回调
   * @param {boolean} [showLoading] 是否显示加载
   * @return {Promise} Promise对象
   */
  delete(url, data = {}, success, showLoading) {
    return this._request('DELETE', url, data, success, showLoading);
  },

  /**
   * 文件上传方法
   * @param {string} url 请求URL
   * @param {Object} [params] 其他参数
   * @param {string|Array} [filePath] 文件路径或文件路径数组
   * @param {string} [name] 文件对应的key，默认'file'
   * @param {boolean} [showLoading] 是否显示加载
   * @return {Promise} Promise对象
   */
  upload(url, params = {}, filePath, name = 'file', showLoading = true) {
    // 参数调整
    if (typeof params === 'string' || Array.isArray(params)) {
      showLoading = name;
      name = filePath;
      filePath = params;
      params = {};
    } else if (typeof filePath === 'boolean') {
      showLoading = filePath;
      filePath = undefined;
      name = 'file';
    } else if (typeof name === 'boolean') {
      showLoading = name;
      name = 'file';
    }

    if (showLoading) {
      alert.showLoading();
    }

    return new Promise((resolve, reject) => {
      const uploadTask = uni.uploadFile({
        url: this.upLoadUrl + url,
        filePath: Array.isArray(filePath) ? filePath[0] : filePath, // 暂时只支持单文件上传
        name: name,
        formData: {
          ...params,
          'Authorization': `Bearer ${login.getValue('token')}`
        },
        header: {
          'Authorization': `Bearer ${login.getValue('token')}`
        },
        success: (res) => {
          try {
            // 尝试解析JSON
            const data = JSON.parse(res.data);
            if (res.statusCode === 200 && data?.code === 200) {
              resolve(data);
            } else if (data?.code === 401) {
              uni.showToast({ title: '登录过期，请重新登录' })
              uni.navigateTo({ url: '/pages/user/login' });
              reject(new Error('未授权，请重新登录'));
            } else {
              const errorMsg = data?.message || data?.error || '上传失败';
              alert.showError(errorMsg);
              reject(new Error(errorMsg));
            }
          } catch (e) {
            console.error('上传响应解析失败:', e);
            alert.showError('上传响应格式错误');
            reject(e);
          }
        },
        fail: (err) => {
          console.error('上传失败:', err);
          alert.showError('文件上传失败');
          reject(err);
        },
        complete: () => {
          if (showLoading) {
            uni.hideLoading();
          }
        }
      });

      // 可以监听上传进度
      // uploadTask.onProgressUpdate((res) => {
      //   console.log('上传进度:', res.progress);
      // });
    });
  }
};

export default ajax;